/**
 * @author Luis Antonio Lara Capetillo Fecha: 19/07/11 Descripcion: En esta
 * clase se crean las clase en .NET de cada capa
 * @version 1.0
 */
package RapiWeb;

import RapiWeb.Objeto.CampoBD;
import RapiWeb.Objeto.Tabla;
import RapiWeb.Objeto.Proyecto;
import Utilidades.Archivo;
import Utilidades.Utilidades;

public class Clase_NET {

    private String str_NomClase;
    private String str_NomTabla;
    private Proyecto proyecto;
    private Utilidades utilidad = new Utilidades();
    private Archivo archivo;
    private Tabla tabla;
    private CampoBD[] camposBD;

    public Clase_NET(Proyecto proyecto, Tabla tabla) {
        archivo = new Archivo();
        this.proyecto = proyecto;
        this.tabla = tabla;
        this.str_NomClase = tabla.getStr_NomTabla();
        this.str_NomTabla = tabla.getStr_NomTabla();
        camposBD = tabla.getCamposBD();

    }

    /**
     * Metodo para crear un encabezado de comentarios de la clase
     *
     * @param descripcion
     * @return str_Comentarios
     */
    public String m_CrearComentarios(String descripcion) {
        String str_Comentarios = "''========================================================\n"
                + "'' Autor: \t\t" + proyecto.getStr_Autor() + "\n"
                + "'' Fecha Creación: \t" + utilidad.dameFecha() + "\n"
                + "'' Descripcion: \t" + descripcion + "\n"
                + "''========================================================\n\n";
        return str_Comentarios;
    }

    /**
     * Metodo para crear variables de la clase
     *
     * @return str_Variables
     */
    private String m_CrearVariable() {
        String str_Variables = "";
        if (proyecto.getStr_Lenguaje().equals("VB")) {
            for (int i = 0; i < camposBD.length; i++) {
                str_Variables += "\tPrivate " + proyecto.getStr_VarGeneral() + camposBD[i].getStr_NomCampo() + " As " + camposBD[i].getStr_TipoVB() + "\n";
            }
        } else {
            for (int i = 0; i < camposBD.length; i++) {
                str_Variables += "\tprivate " + camposBD[i].getStr_TipoVB() + " " + proyecto.getStr_VarGeneral() + camposBD[i].getStr_NomCampo() + ";\n";
            }
        }
        return str_Variables;
    }

    /**
     * Metodo para crear las propiedades de la capa de Entidad
     *
     * @return str_Propiedades
     */
    public String m_CrearPropiedad() {
        String str_propiedad = "";
        String str_Propiedades = "";
        for (int i = 0; i < camposBD.length; i++) {
            archivo = new Archivo();
            archivo.m_LeerArchivo("Archivos/Codigo/Property." + proyecto.getStr_Lenguaje());
//            System.out.println(archivo.dameError());
            String str_NomVariable = proyecto.getStr_VarGeneral() + camposBD[i].getStr_NomCampo();
            String str_Trim = m_CrearTrim(camposBD[i].getStr_TipoVB());
            String str_NomProperty = ("" + camposBD[i].getStr_NomCampo().charAt(0)).toUpperCase() + camposBD[i].getStr_NomCampo().substring(1);
            str_propiedad = archivo.dameContenido().replace("?NomProperty", str_NomProperty.trim());
            str_propiedad = str_propiedad.replace("?NomVariable", str_NomVariable.trim());
            str_propiedad = str_propiedad.replace("?Tipo", camposBD[i].getStr_TipoVB());
            str_propiedad = str_propiedad.replace("?Trim", str_Trim);
            str_Propiedades += str_propiedad + "\n";
        }
        System.out.println("Total campos: " + camposBD.length);
        return str_Propiedades;
    }

    /**
     * Metodo para crear los parametros de la funcion en visual basic
     *
     * @return str_Parametros
     */
    private String m_CrearParametro() {
        String str_Parametros = "";
        if (proyecto.getStr_Lenguaje().equals("VB")) {
            for (int i = 1; i < camposBD.length; i++) {
                String str_NomParametro = proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo();
                str_Parametros += str_NomParametro + " As " + camposBD[i].getStr_TipoVB();
                if (i == camposBD.length - 1) {
                    str_Parametros += "";
                } else {
                    str_Parametros += ", ";
                }
            }
        } else if (proyecto.getStr_Lenguaje().equals("CS")) {
            for (int i = 1; i < camposBD.length; i++) {
                String str_NomParametro = proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo();
                str_Parametros +=camposBD[i].getStr_TipoVB() +" "+str_NomParametro;
                if (i == camposBD.length - 1) {
                    str_Parametros += "";
                } else {
                    str_Parametros += ", ";
                }
            }
        } else {
            for (int i = 0; i < camposBD.length; i++) {
                String str_NomParametro = proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo();
                str_Parametros +=camposBD[i].getStr_TipoVB() +" "+str_NomParametro;
                if (i == camposBD.length - 1) {
                    str_Parametros += "";
                } else {
                    str_Parametros += ", ";
                }
            }
        }

        return str_Parametros;
    }

    /**
     * Metodo para crear asignar los valores a los parametros del procedimiento
     * sql llamado en la funcion
     *
     * @return str_AddParametro
     */
    private String m_CrearAddParametro() {
        String str_AddParametro = "";
        if (proyecto.getStr_Lenguaje().equals("VB")) {
            for (int i = 1; i < camposBD.length; i++) {
                String str_NomParametro = proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo();
                str_AddParametro += "          oraCommandDocumentos.Parameters.Add(\"" + str_NomParametro + "\", " + str_NomParametro + ")\n";
            }
        } else if (proyecto.getStr_Lenguaje().equals("CS")) {
            for (int i = 1; i < camposBD.length; i++) {
                String str_NomParametro = proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo();
                str_AddParametro += "          cmd.Parameters.AddWithValue(\"" + str_NomParametro + "\", " + str_NomParametro + ");\n";
            }
        } else {
            for (int i = 0; i < camposBD.length; i++) {
                String str_NomParametro = proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo();
                str_AddParametro += "\t call.set"+camposBD[i].getStr_TipoVB()+"(" + (i+1) + ", " + str_NomParametro + ");\n";
            }
        }

        return str_AddParametro;
    }

    /**
     * Metodo encargado de generar la clase entidad de la tabla creada
     *
     * @return str_CapaEntidad
     */
    public String m_CrearCapaEntidad() {
        String str_CapaEntidad = "";
        String str_Variabes = m_CrearVariable();
        String str_Property = m_CrearPropiedad();
        archivo = new Archivo();
        archivo.m_LeerArchivo(proyecto.getStr_NomProyecto() + "/Capas/Entidad." + proyecto.getStr_Lenguaje());
        str_CapaEntidad = archivo.dameContenido();
        str_CapaEntidad = str_CapaEntidad.replace("?NomTabla", str_NomTabla);
        str_CapaEntidad = str_CapaEntidad.replace("?NomAutor", proyecto.getStr_Autor());
        str_CapaEntidad = str_CapaEntidad.replace("?Fecha", utilidad.dameFecha());
        str_CapaEntidad = str_CapaEntidad.replace("?NomClase", str_NomClase);
        str_CapaEntidad = str_CapaEntidad.replace("?Variables", str_Variabes);
        str_CapaEntidad = str_CapaEntidad.replace("?Propertys", str_Property);
        return str_CapaEntidad;
    }

    /**
     * Metodo para crear la clase encargada de los datos
     *
     * @return str_CapaDatos
     */
    public String m_CrearCapaDatos() throws Exception{
        str_NomClase = proyecto.getStr_ClaseDatos() + str_NomTabla;
        String str_CapaDatos;
        String str_Parametros = m_CrearParametro();
        String str_Add = m_CrearAddParametro();
        String str_Asignacion = m_CrearAsignaObjeto();
//        String str_Nid = camposBD[0].getStr_NomCampo();
        archivo = new Archivo();
        archivo.m_LeerArchivo(proyecto.getStr_NomProyecto() + "/Capas/Datos." + proyecto.getStr_Lenguaje());
        System.out.println(archivo.dameError());
        str_CapaDatos = archivo.dameContenido();
        str_CapaDatos = str_CapaDatos.replace("?NomAutor", proyecto.getStr_Autor());
        str_CapaDatos = str_CapaDatos.replace("?Fecha", utilidad.dameFecha());
        str_CapaDatos = str_CapaDatos.replace("?NomClase", str_NomClase);
        str_CapaDatos = str_CapaDatos.replace("?NomTabla", str_NomTabla);
        str_CapaDatos = str_CapaDatos.replace("?Parametros", str_Parametros);
        str_CapaDatos = str_CapaDatos.replace("?Add", str_Add);
        str_CapaDatos = str_CapaDatos.replace("?Asignacion", str_Asignacion);
        str_CapaDatos = str_CapaDatos.replace("?Signos", m_CrearSignos());
        str_CapaDatos = str_CapaDatos.replace("?TotalCampos", "" + (camposBD.length + 1));
//        str_CapaDatos = str_CapaDatos.replace("?Nid", "pNidDocumento");

        return str_CapaDatos;
    }

    /**
     * Metodo para crear signos de interrogacion utilizados en la capa de datos
     * de java
     * @return str_Signos
     */
    public String m_CrearSignos() {
        String str_Signos = "";
        if (proyecto.getStr_Lenguaje().equals("Java")) {
            for (int i = 0; i < camposBD.length; i++) {
                str_Signos += "?";
                if (i == camposBD.length - 1) {
                    str_Signos += "";
                } else {
                    str_Signos += ", ";
                }
            }
        }
        return str_Signos;
    }

    /**
     * Metodo para crear la asignacion de las propiedades de un objeto en la
     * capa de datos del lenguaje
     * @return str_Asigna
     */
    public String m_CrearAsignaObjeto() {
        String str_Asigna = "";

        if (proyecto.getStr_Lenguaje().equals("Java")) {
            for (int i = 0; i < camposBD.length; i++) {
                String str_Tipo = camposBD[i].getStr_TipoVB();
                str_Tipo = ("" + str_Tipo.charAt(0)).toUpperCase() + str_Tipo.substring(1);
                String str_NomCampo = camposBD[i].getStr_NomCampo();
                String str_NomMetodo = ("" + str_NomCampo.charAt(0)).toUpperCase() + str_NomCampo.substring(1);
                str_Asigna += "\t dto.set" + str_NomMetodo + "(rs.get" + str_Tipo + "(\"" + str_NomCampo + "\"));\n";
            }
        }

        return str_Asigna;
    }

    /**
     * Metodo para crear la clase para el reporte de cristal reports
     *
     * @return str_CapaReporte
     */
    public String m_CrearClaseReporte() {
        String str_CapaReporte;
        String str_ReporteParametros = m_CrearParametroReporte();
        archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo/Reporte.vb");
        System.out.println(archivo.dameError());
        str_CapaReporte = archivo.dameContenido();
        str_CapaReporte = str_CapaReporte.replace("?ReporteParametros", str_ReporteParametros);
        str_CapaReporte = str_CapaReporte.replace("?NomTabla", str_NomTabla);
        return str_CapaReporte;
    }

    /**
     * Metodo para crear la clase para ver el reporte de cristal reports
     *
     * @return str_CapaReporteASPX
     */
    public String m_CrearClaseReporteASPX() {
        String str_Reporte;
        archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo/Reporte.xml");
        System.out.println(archivo.dameError());
        str_Reporte = archivo.dameContenido();
        str_Reporte = str_Reporte.replace("?NomTabla", str_NomTabla);
        return str_Reporte;
    }

    /**
     * Metodo para crear la clase Negocios
     *
     * @return str_Negocios
     */
    public String m_CrearCapaNegocios() {
        str_NomClase = proyecto.getStr_ClaseNegocio() + str_NomTabla;
        String str_Negocios;
        String str_Parametros = m_CrearParametro();
        archivo = new Archivo();
        archivo.m_LeerArchivo(proyecto.getStr_NomProyecto() + "/Capas/Negocios." + proyecto.getStr_Lenguaje());
        System.out.println(archivo.dameError());
        str_Negocios = archivo.dameContenido();
        str_Negocios = str_Negocios.replace("?NomTabla", str_NomTabla);
        str_Negocios = str_Negocios.replace("?NomAutor", proyecto.getStr_Autor());
        str_Negocios = str_Negocios.replace("?Fecha", utilidad.dameFecha());
        str_Negocios = str_Negocios.replace("?NomClase", str_NomClase);
        str_Negocios = str_Negocios.replace("?NomTabla", str_NomTabla);
        str_Negocios = str_Negocios.replace("?Parametros", str_Parametros);
        str_Negocios = str_Negocios.replace("?IdTabla", camposBD[0].getStr_NomCampo());
        str_Negocios = str_Negocios.replace("?Asignaciones", m_CrearAsignaciones());

        String str_Variabes = m_CrearVariable();
        String str_Property = m_CrearPropiedad();
        str_Negocios = str_Negocios.replace("?Variables", str_Variabes);
        str_Negocios = str_Negocios.replace("?Propertys", str_Property);

        return str_Negocios;
    }

    public String m_CrearAsignaciones() {
        String str_Asigna = "";

        if (proyecto.getStr_Lenguaje().equals("Java")) {
            for (int i = 0; i < camposBD.length; i++) {
                String str_Tipo = camposBD[i].getStr_TipoVB();
                str_Tipo = ("" + str_Tipo.charAt(0)).toUpperCase() + str_Tipo.substring(1);
                String str_NomCampo = camposBD[i].getStr_NomCampo();
                String str_NomMetodo = ("" + str_NomCampo.charAt(0)).toUpperCase() + str_NomCampo.substring(1);
                str_Asigna += "\t "+str_NomCampo+" = "+str_NomTabla+".get(0).get"+str_NomMetodo+"();\n";
            }
        }

        return str_Asigna;
    }
    
    /**
     * Metodo para crear trim
     *
     * @param tipo tipo de dato
     * @return valor
     */
    private String m_CrearTrim(String tipo) {
        String valor = "";
        if (tipo.equals("String")) {
            valor = ".Trim";
        }
        return valor;
    }

    /**
     * Metodo para crear los parametros para clase de reporte
     *
     * @return str_RParametros
     */
    private String m_CrearParametroReporte() {
        String str_RParametros = "";
        for (int i = 0; i < camposBD.length; i++) {
            String str_Tipo = camposBD[i].getStr_Tipo();
            String pCampo = proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo();
            String campo = camposBD[i].getStr_NomCampo();
            if (str_Tipo.equals("DATE") || str_Tipo.equals("SMALLDATETIME") || str_Tipo.equals("TIMESTAMP")) {
                str_RParametros += "reporte.SetParameterValue(\"" + pCampo + "\", CDate(tDetalle.Rows(0)(\"" + campo + "\")).ToString(\"dd/MM/yyyy HH:mm:ss\"))\n      ";
            } else {
                str_RParametros += "reporte.SetParameterValue(\"" + pCampo + "\", tDetalle.Rows(0)(\"" + campo + "\").ToString)\n      ";
            }
        }
        return str_RParametros;
    }
}
